package com.tushen.task;

import com.tushen.utils.SqlSessionFactoryUtil;
import com.tushen.utils.Utils;
import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconst;
import org.gdal.osr.SpatialReference;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 快速表层浓度场dat格式，处理
 * 样例 D:\其他\hesu\202004150900扩散96_145
 * 生成文件名格式，polcon202004151800.tif。
 * 处理过程
 * 1.获取dat格式文件
 * 2.生成tif文件至geoserver目录(polcon2已经发布服务）
 * 3.将tif文件信息写入数据库表polcon2
 * @author likun
 * @version 1.0
 * @date 2020/12/13 2:10 下午
 */
public class Dat {

    // @param double[] argin  地理坐标 米转经纬度单位
    // 0:左上角x坐标 1:东西方向空间分辨率 2:x方向旋转角0° 3:左上角y坐标 4:y方向旋转角0° 5:南北方向空间分辨率
//    static  int width=450,height=600;//海南
//    static double[] argin = {105.5, 0.01, 0, 22, 0, -0.01};
    static  int width=480,height=400;//渤海
    static double[] argin = {117.57, 0.0098125, 0, 40.938, 0, -0.00966};

    public static void main(String[] args){

//        String dirs="D:\\其他\\hesu\\202004150900扩散96_145";
//        String outDir="D:\\其他\\hesu\\202004150900扩散96_145\\tifs";
        if(args.length<2){
            System.out.println("plese input filePah and output filePath");
            return;
        }
        String dirs=args[0];
        String outDir=args[1];
        createTifs(dirs,outDir);
    }

    private static void insertTableTif(String fileName){
        String regEx="[^0-9]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(fileName);
        String dtmStr=m.replaceAll("").trim();
        String sql="insert into polcon2(location,ingestion)\n" +
                   "values('"+fileName+"', to_timestamp('"+dtmStr+"','yyyyMMddHH24mi')) on conflict(location) do nothing;";
        SqlSessionFactoryUtil.excuteUpdateSql(sql);
    }

    public static void createTifs(String inDir,String outDir){
        File file=new File(inDir);
        String fileSep=java.io.File.separator;
        if(file.isDirectory()){
            File[] files=file.listFiles();
            for (int i=0;i<files.length;i++){
                if(files[i].getName().endsWith("dat")){
                    String fileName=files[i].getName().replace(".dat",".tif");
                    String tifPath=outDir+fileSep+fileName;
                    createTif(tifPath,files[i].getAbsolutePath());
                    insertTableTif(fileName);
                    System.out.println(fileName+" finished");
                }
            }
        }
    }


    public static  void createTif(String strVectorFile,String txtArrayFile) {
        gdal.AllRegister();
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");

        SpatialReference ref = new SpatialReference();
        ref.SetWellKnownGeogCS("WGS84");

        ref.ExportToWkt();// 可配置String数组 defWkt
        String strDriverName = "GTiff";
        org.gdal.gdal.Driver oDriver = gdal.GetDriverByName(strDriverName);
        if (oDriver == null) {
            System.out.println(strDriverName + " 驱动不可用！\n");
            return;
        }
        // @param数 (name, xsize, ysize, bands, java.lang.String[] options)
        String[] options = null;// 6个参数
        Dataset dataset = oDriver.Create(strVectorFile, width, height, 1, gdalconst.GDT_Float32);
        // @param double[] argin  地理坐标 米转经纬度单位
        // 0:左上角x坐标 1:东西方向空间分辨率 2:x方向旋转角0° 3:左上角y坐标 4:y方向旋转角0° 5:南北方向空间分辨率

        dataset.SetGeoTransform(argin);
        dataset.SetSpatialRef(ref);
        dataset.SetMetadataItem("COMPRESSION", "LZW", "IMAGE_STRUCTURE");
        // @param int xoff(偏移量), int yoff, int xsize, int ysize, int buf_type, byte[] array
        Band band = dataset.GetRasterBand(1);// 波段  (色彩)
        double[][] txtArray = Utils.readTxtToArray(txtArrayFile);
        float[] arr = new float[width * height];
        int c = 0;
        for (int j2 = (height-1); j2 >=0; j2--) {
            for (int j = 0; j <width; j++) {
                if(txtArray[j][j2]>0){
                    arr[c] = (float) txtArray[j][j2];
                }else{
                }

                c++;
            }
        }
        // ReadRaster​(int xoff, int yoff, int xsize, int ysize, int buf_type, float[] array)
        // 参数说明： 起始x 起始y x数量(行) y数量(列) 数据类型 数组
        band.SetNoDataValue(0);
        band.WriteRaster(0, 0, width, height, gdalconst.GDT_Float32, arr);
        dataset.delete();
        oDriver.delete();
    }

}
